package commun;

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

import com.sun.org.apache.xml.internal.security.utils.Base64;



/**
 * 
 * Permet de vérifier l'authenticité de paquets.
 * 
 * @author Valentin Brémond
 * 
 * @version 1.0
 *
 */
public abstract class Authenticite
{
	/**
	 * Permet de vérifier si un paquet est authentique ou pas.
	 * 
	 * @param cleDiffieHellman La clé Diffie-Hellman utilisée pour chiffrer les échanges.
	 * @param motDePasseHache Le mot de passe de l'utilisateur, haché.
	 * @param paquet Le paquet à vérifier.
	 * 
	 * @return true si le paquet est authentique, false sinon.
	 * 
	 * @throws NoSuchAlgorithmException 
	 */
	public static boolean verifierAuthenticite (String cleDiffieHellman, String motDePasseHache, PaquetAuthentification paquet) throws NoSuchAlgorithmException
	{
		String hash = calculerHashControle (motDePasseHache, SecureID.calculerSecureID (), cleDiffieHellman);
		
		// Si les données correspondent
		if (hash.equals (paquet.getHash ()))
		{
			// On valide
			return true;
		}
		
		// Sinon on refuse
		return false;
	}
	
	
	
	/**
	 * Permet de générer un paquet d'authentification.
	 * 
	 * @param login Le login de l'utilisateur.
	 * @param motDePasseHache Le mot de passe haché de l'utilisateur.
	 * @param cleDiffieHellman La clé de chiffrement utilisée lors des échanges.
	 * 
	 * @return Un paquet d'authentification prêt à être envoyé.
	 * 
	 * @throws NoSuchAlgorithmException 
	 */
	public static PaquetAuthentification genererPaquetAuthentification (String login, String motDePasseHache, String cleDiffieHellman) throws NoSuchAlgorithmException
	{
		return new PaquetAuthentification (login, calculerHashControle (motDePasseHache, SecureID.calculerSecureID (), cleDiffieHellman));
	}
	
	
	
	/**
	 * Permet de calculer le hash d'un paquet d'authentification.
	 * 
	 * @param motDePasseHache Le mot de passe haché de l'utilisateur.
	 * @param secureID La valeur du SecureID
	 * @param cleDiffieHellman La clé utilisée pour chiffrer l'échange.
	 * 
	 * @return Le hash du paquet.
	 * 
	 * @throws NoSuchAlgorithmException 
	 */
	private static String calculerHashControle (String motDePasseHache, String secureID, String cleDiffieHellman) throws NoSuchAlgorithmException
	{
		MessageDigest hachage = MessageDigest.getInstance ("SHA-512");
		
		return Base64.encode (hachage.digest ((motDePasseHache + secureID + cleDiffieHellman).getBytes ()));
	}
}
